home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 24
/
Amiga Format AFCD24 (Feb 1998, Issue 108).iso
/
-seriously_amiga-
/
shareware
/
programming
/
other
/
apic
/
examples
/
ibmkey25.asm
< prev
next >
Wrap
Assembly Source File
|
1998-01-05
|
39KB
|
1,319 lines
;KEY.ASM
; IBM keyboard to Amiga Converter
;
;
; list p=16c84, f=inhx8m ;Enter device name
; include "p16c84.inc"
;*******************following lines added**************************************
;
;The original source is Copyright © 1997 Stephen Marsden, taken from
;EPic12.lha, this changes are made to assemble MPASM source on Amiga
;with PICAsm.
;
;
;Dirk Düsterberg
;
; [InterNet] duesterb@unixserv.rz.fh-hannover.de
; [Homepage] http://linux.rz.fh-hannover.de/~duesterb/
;
list p=16c84 ;Enter device name
include "includes:p16cxx.inc"
;16c84 spezial register (EECON1) assigns:
CBLOCK 0
RD
WR
WREN
WRERR
EEIF
ENDC
;******************************************************************************
#DEFINE PAGE0 bcf STATUS,RP0
#DEFINE PAGE1 bsf STATUS,RP0
;
;------------------------------------------------------
;Please define ScratchPadRam here:
;If you are using PIC16C5X define "ScratchPadRam equ 0x10"
;else define "ScratchPadRam equ 0x20"
;-------------------------------------------------------
;
ScrollLock equ 0x0
NumLock equ 0x1
CapsLock equ 0x2
Kclk equ 0x1
Kdat equ 0x0
Aclk equ 0x4
Adat equ 0x3
Arst equ 0x2
Ctrlbit equ 0x0
RAmigabit equ 0x1
LAmigabit equ 0x2
Keytype equ 0x0
Resetype equ 0x1
;
;
ScratchPadRam equ 0x0C
;
Capbit equ ScratchPadRam+0x0
Capdown equ ScratchPadRam+0x1
CtrlDown equ ScratchPadRam+0x2
RESET equ ScratchPadRam+0x3
Lights equ ScratchPadRam+0x4
Count3 equ ScratchPadRam+0x5
ATparity equ ScratchPadRam+0x6
Make equ ScratchPadRam+0x7
Charbad equ ScratchPadRam+0x8
Oldchar equ ScratchPadRam+0x9
Amigachar equ ScratchPadRam+0xA
Count1 equ ScratchPadRam+0xB
Count2 equ ScratchPadRam+0xC
ATchar equ ScratchPadRam+0xD
tableoffset equ ScratchPadRam+0xE
AltConfig equ ScratchPadRam+0xF
Savechar equ ScratchPadRam+0x10
returnvalue equ ScratchPadRam+0x11
eeaddress equ ScratchPadRam+0x12
eedata equ ScratchPadRam+0x13
win95 equ ScratchPadRam+0x14
Savechar2 equ ScratchPadRam+0x15
;
;
org 0x0
goto start
ATtb1
movwf PCL
retlw 0x4F ;F9
retlw 0x0
retlw 0x57 ;F5
retlw 0x5B ;F3
retlw 0x5F ;F1
retlw 0x5D ;F2
retlw 0x41 ;F12=help
retlw 0x0
retlw 0x4D ;F10
retlw 0x51 ;F8
retlw 0x55 ;F6
retlw 0x59 ;F4
retlw 0x7B ;TAB
retlw 0xFF ;~
retlw 0x0
retlw 0x0
retlw 0x37 ;Left ALT
retlw 0x3F ;Left SHIFT
retlw 0x0
goto lctrl ;Left Ctrl
retlw 0xDF ;Q
retlw 0xFD ;1
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x9D ;Z
retlw 0xBD ;S
retlw 0xBF ;A
retlw 0xDD ;W
retlw 0xFB ;2
retlw 0x0
retlw 0x0
retlw 0x99 ;C
retlw 0x9B ;X
retlw 0xBB ;D
retlw 0xDB ;E
retlw 0xF7 ;4
retlw 0xF9 ;3
retlw 0x0
retlw 0x0
retlw 0x7F ;SPACE
retlw 0x97 ;V
retlw 0xB9 ;F
retlw 0xD7 ;T
retlw 0xD9 ;R
retlw 0xF5 ;5
retlw 0x0
retlw 0x0
retlw 0x93 ;N
retlw 0x95 ;B
retlw 0xB5 ;H
retlw 0xB7 ;G
retlw 0xD5 ;Y
retlw 0xF3 ;6
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x91 ;M
retlw 0xB3 ;J
retlw 0xD3 ;U
retlw 0xF1 ;7
retlw 0xEF ;8
retlw 0x0
retlw 0x0
retlw 0x8F ;<
retlw 0xB1 ;K
retlw 0xD1 ;I
retlw 0xCF ;O
retlw 0xEB ;0
retlw 0xED ;9
retlw 0x0
retlw 0x0
retlw 0x8D ;>
retlw 0x8B ;/
retlw 0xAF ;L
retlw 0xAD ; ';'
retlw 0xCD ;P
retlw 0xE9 ;-
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0xAB ;@
retlw 0x0
retlw 0xCB ;[
retlw 0xE7 ;=
retlw 0x0
retlw 0x0
retlw 0x3B ;CAPS LOCK?
retlw 0x3D ;Right SHIFT
retlw 0x77 ;RETURN
retlw 0xC9 ;]
retlw 0x0
retlw 0xA9 ;#=right foreign key
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x9F ;\ (next to left shift on AT keyboard)
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x7D ;Back SPACE
retlw 0x0
retlw 0x0
retlw 0xC5 ;1 keypad
retlw 0x0
retlw 0xA5 ;4 keypad
retlw 0x85 ;7 keypad
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0xE1 ;0 keypad
retlw 0x87 ;dot keypad
retlw 0xC3 ;2 keypad
retlw 0xA3 ;5 keypad
retlw 0xA1 ;6 keypad
retlw 0x83 ;8 keypad
retlw 0x75 ;ESCAPE!
retlw 0x4B ;Number Lock=( keypad
retlw 0xE5 ;F11=\
retlw 0x43 ;+ keypad
retlw 0xC1 ;3 keypad
retlw 0x6B ;- keypad
retlw 0x45 ;* keypad
retlw 0x81 ;9 keypad
retlw 0x49 ;scroll Lock=) keypad
retlw 0x0
ATtb2:
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x53 ;F7
goto prtscreen ;print screen=R Amiga P
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x35 ;Right ALT
retlw 0x0
retlw 0x0
goto rctrl ;Right CTL
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x33 ;Left Win=Left Amiga
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x31 ;Right Win=Right Amiga
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
goto swapscreen ;Menu Key=L-Amiga M
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x8B ;/key, supposedly
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x79 ;Numeric Enter
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
goto endkey ;End=Shift right-cursor
retlw 0x0
retlw 0x61 ;Cursor Left
goto home ;Home=Shift left-cursor
retlw 0x0
retlw 0x0
retlw 0x63 ;MACRO key=control
goto insert ;Insert=Right Amiga 7
retlw 0x73 ;Delete
retlw 0x65 ;Cursor Down
retlw 0x0
retlw 0x63 ;Cursor Right
retlw 0x67 ;Cursor Up
retlw 0x0
retlw 0x0
retlw 0x0
retlw 0x0
goto pagedown ;Page Down=Shift down-cursor
retlw 0x0
goto prtscreen ;print screen=Right Amiga P
goto pageup ;Page up=Shift up-cursor
goto break ;Break=Ctrl-C
; retlw 0x0
; *** Left Control key ***
lctrl
btfsc win95,0x0
retlw 0x39 ; ctrl
retlw 0x33 ; left Amiga
; *** Right Control key ***
rctrl
btfsc win95,0x0
retlw 0x39 ; ctrl
retlw 0x31 ; right Amiga
; *** Menu = Left Amiga-M ***
swapscreen
movlw 0x33 ; Left Amiga pressed
call actualtransmit
movlw 0x91 ; M pressed & released
call sendmessage
movlw 0x32 ; Left Amiga released
call actualtransmit
retlw 0x0
; *** Prt Scrn Key = Right Amiga-P ***
prtscreen
movlw 0x31 ; Right Amiga pressed
call actualtransmit
movlw 0xCD ; P pressed & released
call sendmessage
movlw 0x30 ; Right Amiga released
call actualtransmit
retlw 0x0
; *** End Key = Shift right-cursor ***
endkey
movlw 0x3D ; Right shift pressed
call actualtransmit
movlw 0x63 ; right-cursor pressed & released
call sendmessage
movlw 0x3C ; Right shift released
call actualtransmit
retlw 0x0
; *** Home Key = Shift left-cursor ***
home
movlw 0x3D ; Right shift pressed
call actualtransmit
movlw 0x61 ; left-cursor pressed & released
call sendmessage
movlw 0x3C ; Right shift released
call actualtransmit
retlw 0x0
; *** PageDown Key = Shift down-cursor ***
pagedown
movlw 0x3D ; Right shift pressed
call actualtransmit
movlw 0x65 ; down-cursor pressed & released
call sendmessage
movlw 0x3C ; Right shift released
call actualtransmit
retlw 0x0
; *** Pageup Key = Shift up-cursor ***
pageup
movlw 0x3D ; Right shift pressed
call actualtransmit
movlw 0x67 ; up-cursor pressed & released
call sendmessage
movlw 0x3C ; Right shift released
call actualtransmit
retlw 0x0
; *** Insert Key = Right Amiga 7 ***
insert
movlw 0x31 ; Right Amiga pressed
call actualtransmit
movlw 0xF1 ; 7 pressed & released
call sendmessage
movlw 0x30 ; Right Amiga released
call actualtransmit
retlw 0x0
; *** Break Key = Ctrl-C ***
break
movlw 0x39 ; Ctrl pressed
call actualtransmit
movlw 0x99 ; C pressed & released
call sendmessage
movlw 0x38 ; Ctrl released
call actualtransmit
retlw 0x0
; *** Wait a long time ***
longdelay
movwf Count1
dly
call fixeddelay
decfsz Count1,F
goto dly
return
;
; *** Wait a short while ***
fixeddelay
movlw 0xFF
smalldelay
movwf Count2
delay
decfsz Count2,F
goto delay
return
; *** Send character to Amiga and wait for handshake ***
amigatransmit
movwf Amigachar
subwf Oldchar,W
btfsc STATUS,Z ; skip if not equal
return ; ignore it
movlw 0x33 ; LAmiga pressed
subwf Amigachar,W
btfsc STATUS,Z ; skip if not equal
bcf RESET,LAmigabit
movlw 0x32 ; LAmiga released
subwf Amigachar,W
btfsc STATUS,Z ; skip if not equal
bsf RESET,LAmigabit
movlw 0x31 ; RAmiga pressed
subwf Amigachar,W
btfsc STATUS,Z ; skip if not equal
bcf RESET,RAmigabit
movlw 0x30 ; RAmiga released
subwf Amigachar,W
btfsc STATUS,Z ; skip if not equal
bsf RESET,RAmigabit
movlw 0x3B ; jump if not Capslock down
subwf Amigachar,W
btfss STATUS,Z ; skip if equal
goto transok2 ; ignore it
bcf RESET,Ctrlbit
movf Amigachar,W
movwf Oldchar
movlw 0xFF
movwf Capdown ; set flags for later
return
transok2
movlw 0x3A ; jump if not Capslock up
subwf Amigachar,W
btfss STATUS,Z ; skip if equal
goto transok3 ; ignore it
bsf RESET,Ctrlbit
movlw 0x3B ; see if Capslock was just down
subwf Oldchar,W ;
btfss STATUS,Z ; skip if equal
goto transok4 ; use as Ctrl key
clrf Capdown ; clear flag
comf Capbit,F ; toggle down/upness of caplock
movlw 0x3B ; send Capslock down
btfss Capbit,0x0
andlw 0xFE
call actualtransmit
; send lights to AT
movlw 0xED ; Next data is for lights
call SendtoAT
bsf Lights,CapsLock ; Capslock on
btfss Capbit,0x0
bcf Lights,CapsLock ; Capslock off
movf Lights,W
call SendtoAT
return
transok4
btfsc win95,0x0
return
clrf CtrlDown
clrf Capdown ; Capslock has finished acting as ctrl
movlw 0x38 ; send Ctrl up
call actualtransmit
return
transok3
movf Amigachar,W
movwf Savechar2
movwf Oldchar
movf Capdown,F ; Capslock down?
btfsc STATUS,Z ; skip if non-zero i.e caps pressed
goto nocontrol ; ignore it
btfsc win95,0x0
goto nocontrol ; ignore it
movf CtrlDown,F
btfss STATUS,Z ; skip if zero i.e caps pressed
goto nocontrol ; ignore it
movlw 0xFF
movwf CtrlDown ; Caps lock is now Ctrl key
movlw 0x39 ; send Ctrl down
call actualtransmit
movf Savechar2,W
goto actualtransmit
nocontrol
movf Amigachar,W
andlw 0xFE
sublw 0x44 ; * (Numkey) released
btfss STATUS,Z ; skip if equal
clrf AltConfig
incf AltConfig,F
movlw 0x28 ; 20 th time?
subwf AltConfig,W
btfsc STATUS,Z ; skip if not equal
call config
movf Amigachar,W
actualtransmit
movwf Amigachar
movlw .5 ; do a 5x256 delay
call longdelay
actual2
movlw .8
movwf Count1
clrf Charbad
f
btfsc Amigachar,0x7 ; IF bit7=1 THEN Adat=1
bsf PORTA,Adat
btfss Amigachar,0x7 ; IF bit7=0 THEN Adat=0
bcf PORTA,Adat
movlw .8
call smalldelay ; Allow Adat logic to settle
bcf PORTA,Aclk ; transmit
movlw .8
call smalldelay ; Allow Aclk logic to settle
bsf PORTA,Aclk ; reset Aclk=1
movlw .10
call smalldelay ; Allow Aclk logic to settle
rlf Amigachar,F
decfsz Count1,F ; Transmit next bit?
goto f
movlw 0xF
movwf Count1
movlw 0xFF
movwf Count1
movwf Count2
PAGE1
bsf TRISA,Adat ; Read acknowledge signal
PAGE0
ack
decf Count1,F
btfsc STATUS,Z
decf Count2,F
movf Count2,W ; Count2=0?
btfsc STATUS,Z
goto syncup ; no handshake
btfsc PORTA,Adat ; wait for handshake from amiga
goto ack
ready
btfss PORTA,Adat ; wait for handshake to finish
goto ready
bsf PORTA,Adat ; reset Adat=1
PAGE1
bcf TRISA,Adat ; Return to output mode
PAGE0
return
syncup
bcf PORTA,Aclk ; send another clock pulse
movlw .8
call smalldelay ; Allow Aclk logic to settle
bsf PORTA,Aclk ; reset Aclk=1
movlw 0xFF
movwf Count1
movwf Count2
decf Count3,F
btfsc STATUS,Z
return
goto ack ; wait for acknowledge again
; *** Send character to AT keyboard and wait for handshake ***
SendtoAT
movwf Charbad
resend
movf Charbad,W
movwf ATchar
clrf ATparity
bsf PORTB,Kclk ; Kclk=1 get keyboards attention
nop
bcf PORTB,Kdat ; Kdat=0 get keyboards attention
PAGE1
bcf TRISB,Kclk ; Kclk is in output mode
nop
bcf TRISB,Kdat ; Kdat is in output mode
PAGE0
movlw .8
movwf Count1
PAGE1
bsf TRISB,Kclk ; Kclk is in input mode
PAGE0
Send4 btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto Send4
btfsc ATchar,0x0 ; IF bit0=1 THEN Kdat=1
bsf PORTB,Kdat
btfss ATchar,0x0 ; IF bit0=0 THEN Kdat=0
bcf PORTB,Kdat
rrf ATchar,F ; next bit
btfsc STATUS,C ; test parity of bit shifted out
incf ATparity,F
Send5 btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto Send5
decfsz Count1,F
goto Send4
Send6 btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto Send6
btfsc ATparity,0x0 ; IF bit0=odd THEN Kdat=0 (odd parity)
bcf PORTB,Kdat
btfss ATparity,0x0 ; IF bit0=even THEN Kdat=1 (odd parity)
bsf PORTB,Kdat
Send7 btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto Send7
Send77 btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto Send77
bsf PORTB,Kdat ; stop bit
Send78 btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto Send78
PAGE1
bsf TRISB,Kdat ; reset Kdat back to input mode
PAGE0
Send79 btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto Send79
Send7a btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto Send7a
movlw .8
call smalldelay ; Allow Kclk logic to settle
bcf PORTB,Kclk ; Kclk=0 Send handshake
PAGE1
bcf TRISB,Kclk ; Kclk is in output mode
PAGE0
movlw .20
call smalldelay ; Allow keyboard chance
call ATgetkey
movlw 0xFA ; Was transmission ok
subwf ATchar,W
btfss STATUS,Z ; skip if good
goto resend
return
; *** Waits for keyboard to send code ***
ATgetkey
clrf ATchar
bsf PORTB,Kclk ; Kclk=1 Allow keyboard to talk
PAGE1
bsf TRISB,Kclk ; Kclk is in input mode
PAGE0
skip1st btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto skip1st
skippy btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto skippy
movlw .8
movwf Count1
ATwait0
btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto ATwait0
rrf ATchar,F
btfsc PORTB,Kdat
bsf ATchar,0x7
btfss PORTB,Kdat
bcf ATchar,0x7
ATwait1 btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto ATwait1
decfsz Count1,F
goto ATwait0 ; get all 8 bits of data
parity0 btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto parity0
parity1 btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto parity1
stop0 btfsc PORTB,Kclk ; wait for keyboard to make Kclk=0
goto stop0
stop1 btfss PORTB,Kclk ; wait for keyboard to make Kclk=1
goto stop1
bcf PORTB,Kclk ; Kclk=0 Send handshake
PAGE1
bcf TRISB,Kclk ; Kclk is in output mode
PAGE0
movlw .20
call smalldelay ; Allow keyboard chance to recieve
return
; *** Flash Light ***
flash
movwf Lights
movlw 0xED ; Next data is for lights
call SendtoAT
movf Lights,W ; Flash lights
call SendtoAT
movlw 0x25
call longdelay
movlw 0xED ; Next data is for lights
call SendtoAT
movlw 0x0 ; Clear Lights
call SendtoAT
movlw 0x25
call longdelay
return
; *** Performs reset on Amiga ***
reset
movlw Resetype
call readdata
sublw 0x1
btfsc STATUS,Z ; skip if not equal
goto kill ; jump if fast reset
movlw 0x0F ; Tell amiga we are going to reset it
call actualtransmit
movlw 0x8
movwf Count3
strobe movlw 0x1
call flash
movlw 0x2
call flash
movlw 0x4
call flash
decfsz Count3,F
goto strobe
kill
movlw 0x70
call longdelay
bcf PORTB,Arst ; Arst=0 Send reset
PAGE1
bcf TRISB,Arst ; Arst is in output mode
PAGE0
movlw 0xFF
call longdelay ; Wait for Amiga to reset
goto start2
start
; *** Allow time for HardDrive to spin upto speed ***
SpinUp
bcf PORTB,Arst ; Arst=0 Send reset
PAGE1
bcf TRISB,Arst ; Arst is in output mode
PAGE0
movlw 0x30
movwf Count3
waitHD
movlw 0xFF
call longdelay ; Wait for drive to wake up
decfsz Count3,F
goto waitHD
start2
; *** Setup ports ***
bsf PORTA,Aclk ; transmit
nop
bsf PORTA,Adat
PAGE1
movlw 0x7
movwf TRISA
movlw 0xFF
movwf TRISB
PAGE0
; *** Clear out miscellaneous flags ***
clrf Capdown
clrf CtrlDown
clrf Capbit
clrf Oldchar
clrf AltConfig
movlw 0x7
movwf RESET
; *** See what sort of keyboard is attached ***
clrf win95
movlw Keytype
call readdata
sublw 0x2
btfsc STATUS,Z ; skip if not equal
comf win95 ; win95=true or false
; *** Wait for AT keyboard to power up ***
waitAT
btfss PORTB,Kdat ; wait for AT keyboard
goto waitAT
; *** Reset AT keyboard ***
; movlw 0xFF ; Reset
; call SendtoAT
movlw 0xF6 ; Default
call SendtoAT
movlw 0x7
call flash
movlw 0xED ; Next data is for lights
call SendtoAT
movlw 0x2
movwf Lights
call SendtoAT
movlw 0xF4 ; Clear buffer
call SendtoAT
ATstyle
movf RESET,F
btfsc STATUS,Z
goto reset
call ATgetkey
movlw 0xE1
subwf ATchar,W
btfss STATUS,Z ; skip if equal
goto ATnE1
call ATgetkey ; should be $14
call ATgetkey ; should be $77
call ATgetkey ; should be $E1
call ATgetkey ; should be $F0
call ATgetkey ; should be $14
call ATgetkey ; should be $F0
call ATgetkey ; should be $77
goto ATstyle
ATnE1
clrf tableoffset
movlw 0xE0
subwf ATchar,W
btfss STATUS,Z ; skip if equal
goto ATnE0
movlw 0x80
movwf tableoffset
call ATgetkey
movlw 0xF0
subwf ATchar,W
btfss STATUS,Z ; skip if equal
goto ATnE0F0
call ATgetkey
movlw 0x12
subwf ATchar,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; E0F012 ignore it
ATnEF12
movlw 0x59
subwf ATchar,W
btfss STATUS,Z ; skip if equal
goto ATup
goto ATstyle ; E0F059 ignore it
ATnE0F0
movlw 0x12
subwf ATchar,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; E012 ignore it
ATnE012
movlw 0x59
subwf ATchar,W
btfss STATUS,Z ; skip if equal
goto ATdown
goto ATstyle ; E059 ignore it
ATnE0
movlw 0xF0
subwf ATchar,W
btfss STATUS,Z ; skip if equal
goto ATdown
call ATgetkey
goto ATup ; F0= key released
ATdown
incf ATchar,W
addwf tableoffset,W
call ATtb1
addlw 0x0 ; test W
btfss STATUS,Z
call amigatransmit
goto ATstyle
ATup
incf ATchar,W
addwf tableoffset,W
movwf tableoffset
movlw 0xAF+1 ; menu key
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0x84+1 ; PrtScrn
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0xE9+1 ; End
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0xEC+1 ; Home
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0xF0+1 ; Insert
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0xFA+1 ; PageDown
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0xFC+1 ; PrtScrn
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0xFD+1 ; PageUp
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movlw 0xFE+1 ; Break
subwf tableoffset,W
btfsc STATUS,Z ; skip if not equal
goto ATstyle ; ignore it
movf tableoffset,W
call ATtb1
andlw 0xFE ; clear bit 0
call amigatransmit
goto ATstyle
; *** Change configuration ***
config
clrf eeaddress
movlw 0x3B ; CAPSLOCK ON
call actualtransmit
call say_select ; Select Type of
call say_key ; key
movlw 0x95 ; b
call sendmessage
movlw 0xCF ; o
call sendmessage
movlw 0xBF ; a
call sendmessage
movlw 0xD9 ; r
call sendmessage
movlw 0xBB ; d
call sendmessage
call say_option1 ; 1=
call say_uk10 ; uk 10
movlw 0xFB ; 2
call sendmessage
movlw 0x7F ; space
call sendmessage
call say_key ; key
call say_option2 ; 2=
call say_uk10 ; uk 10
movlw 0xF5 ; 5
call sendmessage
movlw 0x7F ; space
call sendmessage
call say_key ; key
movlw 0x7F ; space
call sendmessage
movlw 0xDD ; w
call sendmessage
movlw 0xD1 ; i
call sendmessage
movlw 0x93 ; n
call sendmessage
movlw 0xED ; 9
call sendmessage
movlw 0xF5 ; 5
call sendmessage
movlw 0x77 ; return
call sendmessage
call getselection
movwf eedata
movf eedata,W
btfsc STATUS,Z ; skip if not zero
goto config ; bad choice, try again
call writedata
call say_ok
clrf win95
movlw Keytype
call readdata
sublw 0x2
btfsc STATUS,Z ; skip if not equal
comf win95 ; win95=true or false
incf eeaddress
askreset
call say_select ; Select Type of
call say_reset ; reset
call say_option1 ; 1=
movlw 0xB9 ; f
call sendmessage
movlw 0xBF ; a
call sendmessage
movlw 0xBD ; s
call sendmessage
movlw 0xD7 ; t
call sendmessage
movlw 0x7F ; space
call sendmessage
call say_reset ; reset
call say_option2 ; 2=
movlw 0xBD ; s
call sendmessage
movlw 0xAF ; l
call sendmessage
movlw 0xCF ; o
call sendmessage
movlw 0xDD ; w
call sendmessage
movlw 0x7F ; space
call sendmessage
call say_reset ; reset
movlw 0x77 ; return
call sendmessage
call getselection
movwf eedata
movf eedata,W
btfsc STATUS,Z ; skip if not zero
goto askreset ; bad choice, try again
call writedata
call say_ok
clrf AltConfig
movlw 0x7E ; space up
movf Capdown,F ; Capslock down?
btfsc STATUS,Z ; skip if non-zero i.e caps pressed
movlw 0x3A ; Caps up
movwf Amigachar
return
say_select
movlw 0x77 ; return x2
call sendmessage
call sendmessage
movlw 0xBD ; s
call sendmessage
movlw 0xDB ; e
call sendmessage
movlw 0xAF ; l
call sendmessage
movlw 0xDB ; e
call sendmessage
movlw 0x99 ; c
call sendmessage
movlw 0xD7 ; t
call sendmessage
movlw 0x7F ; space
call sendmessage
movlw 0xD7 ; t
call sendmessage
movlw 0xD5 ; y
call sendmessage
movlw 0xCD ; p
call sendmessage
movlw 0xDB ; e
call sendmessage
movlw 0x7F ; space
call sendmessage
movlw 0xCF ; o
call sendmessage
movlw 0xB9 ; f
call sendmessage
movlw 0x7F ; space
call sendmessage
return
say_key
movlw 0xB1 ; k
call sendmessage
movlw 0xDB ; e
call sendmessage
movlw 0xD5 ; y
call sendmessage
return
say_option1
movlw 0x77 ; return x2
call sendmessage
call sendmessage
movlw 0xFD ; 1
call sendmessage
movlw 0xE7 ; =
call sendmessage
movlw 0x7F ; space
call sendmessage
return
say_option2
movlw 0x77 ; return
call sendmessage
movlw 0xFB ; 2
call sendmessage
movlw 0xE7 ; =
call sendmessage
movlw 0x7F ; space
call sendmessage
return
say_uk10
movlw 0xD3 ; u
call sendmessage
movlw 0xB1 ; k
call sendmessage
movlw 0x7F ; space
call sendmessage
movlw 0xFD ; 1
call sendmessage
movlw 0xEB ; 0
call sendmessage
return
say_ok
movlw 0xCF ; o
call sendmessage
movlw 0xB1 ; k
call sendmessage
movlw 0x77 ; return
call sendmessage
return
say_reset
movlw 0xD9 ; r
call sendmessage
movlw 0xDB ; e
call sendmessage
movlw 0xBD ; s
call sendmessage
movlw 0xDB ; e
call sendmessage
movlw 0xD7 ; t
call sendmessage
return
sendmessage
movwf Savechar
call actualtransmit
movf Savechar,W
andlw 0xFE
call actualtransmit
movf Savechar,W
return
getselection
call ATgetkey
call ATgetkey
call ATgetkey
movlw 0x16 ; was key 1 pressed and released
subwf ATchar,W
btfsc STATUS,Z ; skip if not equal
retlw 0x1
movlw 0x1E ; was key 2 pressed and released
subwf ATchar,W
btfsc STATUS,Z ; skip if not equal
retlw 0x2
retlw 0x0
writedata
movf eeaddress,W
movwf EEADR
movf eedata,W
movwf EEDATA
PAGE1
bsf EECON1,WREN ; EEPROM write enable
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
wait_write
btfss EECON1,EEIF ; wait for write to finish
goto wait_write
clrf EECON1 ; EEPROM write disable & int accept
PAGE0
return
readdata
movwf EEADR
PAGE1
bsf EECON1,RD ; EEPROM read
PAGE0
movf EEDATA,W
return
end